home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / modula2 / pl0 / pl0inter.mod < prev    next >
Encoding:
Modula Implementation  |  1994-09-22  |  3.4 KB  |  137 lines

  1.  
  2.  
  3. IMPLEMENTATION MODULE PL0Interpreter;
  4.  
  5. FROM TextWindows IMPORT Window, Done, OpenTextWindow, ReadCard, Write,
  6.                         WriteLn, WriteCard, Invert, CloseTextWindow;
  7.                         
  8. FROM Windows IMPORT Title, WindowElements;
  9.  
  10.  
  11. VAR
  12.   win : Window;
  13.   
  14.  
  15. PROCEDURE ReadInt(win : Window; VAR Result : INTEGER);
  16. VAR
  17.   Get : CARDINAL;
  18.   
  19. BEGIN
  20.   ReadCard(win,Get);
  21.   Result := Get;
  22. END ReadInt;
  23.  
  24.   
  25. PROCEDURE Interpret;
  26. CONST 
  27.   stacksize = 1000;
  28.   
  29. VAR
  30.   p,b,t : INTEGER;
  31.   i : Instruction;
  32.   s : ARRAY [0..stacksize-1] OF INTEGER;
  33.   
  34.  
  35.   PROCEDURE base(l : INTEGER) : INTEGER;
  36.   VAR
  37.     b1 : INTEGER;
  38.     
  39.   BEGIN
  40.     b1 := b;
  41.     WHILE l>0 DO
  42.       b1 := s[b1];
  43.       DEC(l);
  44.     END;
  45.     RETURN b1;
  46.   END base;
  47.   
  48.  
  49. BEGIN
  50.   Write(win,14C);
  51.   t := 0;
  52.   b := 1;
  53.   p := 0;
  54.   s[1] := 0;
  55.   s[2] := 0;
  56.   s[3] := 0;
  57.   REPEAT
  58.     i := code[p];
  59.     INC(p);
  60.     WITH i DO
  61.       CASE f OF
  62.         0 : INC(t);
  63.             s[t] := a;                          |
  64.         1 : CASE a OF
  65.               0 : t := b - 1;
  66.                   p := s[t+3];
  67.                   b := s[t+2];                        |   
  68.               1 : s[t] := -s[t];                      |
  69.               2 : DEC(t);
  70.                   s[t] := s[t] + s[t+1];              |
  71.               3 : DEC(t);
  72.                   s[t] := s[t] - s[t+1];              |
  73.               4 : DEC(t);
  74.                   s[t] := s[t] * s[t+1];              |
  75.               5 : DEC(t);
  76.                   s[t] := s[t] DIV s[t+1];            |
  77.               6 : s[t] := ORD(ODD(s[t]));             |
  78.               7 : |
  79.               8 : DEC(t);
  80.                   s[t] := ORD(s[t]=s[t+1]);           |
  81.               9 : DEC(t);
  82.                   s[t] := ORD(s[t] # s[t+1]);         |
  83.              10 : DEC(t);
  84.                   s[t] := ORD(s[t] < s[t+1]);         |
  85.              11 : DEC(t);
  86.                   s[t] := ORD(s[t] >= s[t+1]);        |
  87.              12 : DEC(t);
  88.                   s[t] := ORD(s[t] > s[t+1]);         |
  89.              13 : DEC(t);
  90.                   s[t] := ORD(s[t] <= s[t+1]);        |
  91.              14 : INC(t);
  92.                   Write(win,">");
  93.                   Invert(win,TRUE);
  94.                   ReadInt(win,s[t]);
  95.                   IF NOT Done THEN
  96.                      p := 0;
  97.                   END;
  98.                   Invert(win,FALSE);                  |
  99.              15 : WriteCard(win,s[t],7);
  100.                   WriteLn(win);
  101.                   DEC(t);                             |
  102.             END;                                        |
  103.         2 : INC(t);   
  104.             s[t] := s[base(l)+INTEGER(a)];              |
  105.         3 : s[base(l)+INTEGER(a)] := s[t];
  106.             DEC(t);                                     |
  107.         4 : s[t+1] := base(l);
  108.             s[t+2] := b;
  109.             s[t+3] := p;
  110.             b := t + 1;
  111.             p := a;                                     |
  112.         5 : t := t + INTEGER(a);                        |
  113.         6 : p := a;                                     |
  114.         7 : IF s[t]=0 THEN
  115.                p := a;
  116.             END;
  117.             DEC(t);                                     |
  118.       END;
  119.     END;
  120.   UNTIL p=0;
  121. END Interpret;
  122.  
  123.  
  124. PROCEDURE EndInterpreter;
  125. BEGIN
  126.   CloseTextWindow(win);
  127. END EndInterpreter;
  128.  
  129.  
  130. BEGIN
  131.   OpenTextWindow(win,WindowElements{Title},429,161,210,155,"RESULT");
  132. END PL0Interpreter.
  133.  
  134.   
  135.             
  136.         
  137.